<!DOCTYPE HTML>
<html>

<head>
	<link rel="bookmark"  type="image/x-icon"  href="/img/logo.jpg"/>
	<link rel="shortcut icon" href="/img/logo.jpg">
	
			    <title>
    北望你的安
    </title>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no" />
    <link rel="stylesheet" href="/css/mic_main.css" />
    <link rel="stylesheet" href="/css/dropdownMenu.css" />
    <meta name="keywords" content="北望你的安" />
    
    	<script async src="//busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js"></script>
	 
    <noscript>
        <link rel="stylesheet" href="/css/noscript.css" />
    </noscript>
    <style type="text/css">
        body:before {
          content: ' ';
          position: fixed;
          top: 0;
          background: url('/img/bg.jpg') center 0 no-repeat;
          right: 0;
          bottom: 0;
          left: 0;
          background-size: cover; 
        }
    </style>

			    
  


    <script src="/js/jquery.min.js"></script>
    <script src="/js/jquery.scrollex.min.js"></script>
    <script src="/js/jquery.scrolly.min.js"></script>
    <script src="/js/skel.min.js"></script>
    <script src="/js/util.js"></script>
    <script src="/js/main.js"></script>
	
</head>
    
		
<!-- Layouts -->



<!--  代码渲染  -->
<link rel="stylesheet" href="/css/prism_coy.css" />
<link rel="stylesheet" href="/css/typo.css" />
<!-- 文章页 -->
<body class="is-loading">
    <!-- Wrapper 外包 s-->
    <div id="wrapper" class="fade-in">
        <!-- Intro 头部显示 s -->
        <!-- Intro 头部显示 e -->
        <!-- Header 头部logo start -->
        <header id="header">
    <a href="/" class="logo">Krystalan</a>
</header>
        <!-- Nav 导航条 start -->
        <nav id="nav" class="special" >
            <ul class="menu links" >
			<!-- Homepage  主页  --> 
			<li >
	            <a href="/" rel="nofollow">主页</a>
	        </li>
			<!-- categories_name  分类   --> 
	        
	        <li class="active">
	            <a href="#s1">分类</a>
	                    <ul class="submenu">
	                        <li>
	                        <a class="category-link" href="/categories/%E5%BC%BA%E5%8C%96%E5%AD%A6%E4%B9%A0/">强化学习</a></li><li><a class="category-link" href="/categories/%E6%95%B0%E5%AD%A6/">数学</a></li><li><a class="category-link" href="/categories/%E7%AE%97%E6%B3%95/">算法</a></li><li><a class="category-link" href="/categories/%E8%87%AA%E7%84%B6%E8%AF%AD%E8%A8%80%E5%A4%84%E7%90%86/">自然语言处理</a></li><li><a class="category-link" href="/categories/%E9%9A%8F%E7%AC%94/">随笔</a>
	                    </ul>
	        </li>
	        
	        <!-- archives  归档   --> 
	        
	        
		        <!-- Pages 自定义   -->
		        
		        <li>
		            <a href="/tags/" title="标签">
		                标签
		            </a>
		        </li>
		        
		        <li>
		            <a href="/gallery/" title="相册">
		                相册
		            </a>
		        </li>
		        


            </ul>
            <!-- icons 图标   -->
			<ul class="icons">
                    
                    <li>
                        <a title="github" href="https://github.com/krystalan" target="_blank" rel="noopener">
                            <i class="icon fa fa-github"></i>
                        </a>
                    </li>
                    
                    <li>
                        <a title="500px" href="https://www.zhihu.com/people/krystalzhu-an" target="_blank" rel="noopener">
                            <i class="icon fa fa-500px"></i>
                        </a>
                    </li>
                    
			</ul>
</nav>

        <div id="main" >
            <div class ="post_page_title_img" style="height: 25rem;background-image: url(/img/21.jpg);background-position: center; background-repeat:no-repeat; background-size:cover;-moz-background-size:cover;overflow:hidden;" >
                <a href="#" style="padding: 4rem 4rem 2rem 4rem ;"><h2 >PyTorch笔记（六）</h2></a>
            </div>
            <!-- Post -->
            <div class="typo" style="padding: 3rem;">
                <p>本文主要讲述的是神经网络的初始化，pytorch在torch.nn.init中提供了常用的初始化方法函数。  </p>
<h1 id="1-理论篇"><a href="#1-理论篇" class="headerlink" title="1.理论篇"></a>1.理论篇</h1><h2 id="1-1-将所有权重均初始化为0"><a href="#1-1-将所有权重均初始化为0" class="headerlink" title="1.1 将所有权重均初始化为0"></a>1.1 将所有权重均初始化为0</h2><p>先说结论，这个方法是不能采取的，当神经网络中的每个权重都被初始化为相同值时，那么会导致每个神经元的计算结果相同，因此在使用BP算法更新权重时，所有权重又会得到相同的更新，所以失去了学习不同特征的意义，因此我们不能将所有神经元的权重初始化为0，我们要让初始化权重接近0但不为0。  </p>
<h2 id="1-2-Xavier"><a href="#1-2-Xavier" class="headerlink" title="1.2 Xavier"></a>1.2 Xavier</h2><p>参考资料：<u><a href="https://zhuanlan.zhihu.com/p/27919794" target="_blank" rel="noopener">《深度前馈网络与Xavier初始化原理》</a></u>  </p>
<h2 id="1-3-Kaiming"><a href="#1-3-Kaiming" class="headerlink" title="1.3 Kaiming"></a>1.3 Kaiming</h2><blockquote>
<p>Xavier初始化的问题在于，它只适用于线性激活函数，但实际上，对于深层神经网络来说，线性激活函数是没有价值，神经网络需要非线性激活函数来构建复杂的非线性系统。今天的神经网络普遍使用relu激活函数。Kaiming初始化的表现要优于Xavier初始化，实际上，Kaiming初始化已经被Pytorch用作默认的参数初始化函数。</p>
</blockquote>
<p>参考资料：<u><a href="https://www.jianshu.com/p/f2d800388d1c" target="_blank" rel="noopener">《一文搞懂深度网络初始化》</a></u></p>
<h1 id="2-应用篇"><a href="#2-应用篇" class="headerlink" title="2.应用篇"></a>2.应用篇</h1><p>还是先来看一下torch.nn.init的构成吧：<br><img src="/images/pytorch/6.jpg" alt="torch.nn.init">   </p>
<p>以xavier_uniform_为例来介绍一下如何使用：  </p>
<pre><code class="python">w = torch.empty(3, 5)
nn.init.xavier_uniform_(w, gain=nn.init.calculate_gain(&#39;relu&#39;))</code></pre>
<p>这里有一个参数是gain，增益的大小是依据激活函数类型来设定的。</p>
<p>上述例子只是初始化一个tensor，对一个模型的参数进行初始化的具体过程如下，以LeNet-5为例： </p>
<pre><code class="python">class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = nn.Conv2d(3, 6, 5)
        self.pool1 = nn.MaxPool2d(2, 2)
        self.conv2 = nn.Conv2d(6, 16, 5)
        self.pool2 = nn.MaxPool2d(2, 2)
        self.fc1 = nn.Linear(16 * 5 * 5, 120)
        self.fc2 = nn.Linear(120, 84)
        self.fc3 = nn.Linear(84, 10)

    def forward(self, x):
        x = self.pool1(F.relu(self.conv1(x)))
        x = self.pool2(F.relu(self.conv2(x)))
        x = x.view(-1, 16 * 5 * 5)
        x = F.relu(self.fc1(x))
        x = F.relu(self.fc2(x))
        x = self.fc3(x)
        return x

    # 定义权值初始化
    def initialize_weights(self):
        for m in self.modules():
            if isinstance(m, nn.Conv2d):#每一层初始化方法不一样
                torch.nn.init.xavier_normal_(m.weight.data)
                if m.bias is not None:
                    m.bias.data.zero_()
            elif isinstance(m, nn.BatchNorm2d):
                m.weight.data.fill_(1)
                m.bias.data.zero_()
            elif isinstance(m, nn.Linear):
                torch.nn.init.normal_(m.weight.data, 0, 0.01)
                m.bias.data.zero_()</code></pre>
<p>先从self.modules()中遍历每一层，然后判断各层属于什么类型，例如，是否是 nn.Conv2d、nn.BatchNorm2d、nn.Linear等，然后根据不同类型的层，设定不同的权值初始化方法，例如，Xavier，kaiming，normal_，uniform_等。其中self.modules()功能是依次返回模型中的各层。</p>
<p>更多详细介绍请移步官方文档：<a href="https://pytorch.org/docs/stable/nn.init.html" target="_blank" rel="noopener">https://pytorch.org/docs/stable/nn.init.html</a></p>

            </div>

            <!-- Post Comments -->
            

        </div>
        <!-- Copyright 版权 start -->
                <div id="copyright">
            <ul>
                <li>&copy;2020 北望你的安. 版权所有</li>
            </ul>
            
                <span id="busuanzi_container_site_pv">本站总访问量<span id="busuanzi_value_site_pv"></span>次，</span>
				<span id="busuanzi_container_site_uv"> 访客数 <span id="busuanzi_value_site_uv"></span> 人. </span>
			
			<br>
			<span>友情链接：<a href='http://www.demilab.cn' target='_blank'>DEMI实验室</a>&nbsp;&nbsp;&nbsp;<a href='http://zd11024.cn/' target='_blank'>ZD</a></span>
        </div>
    </div>
</body>



 	
</html>
